from selenium import webdriver # 初始化驱动的模块
from selenium.webdriver.chrome.service import Service # 指定驱动的路径
from selenium.webdriver.common.by import By # 操作模块
import time
# 传入驱动的绝对路径（尽量把这个驱动放到项目工程里面）
# service = Service(r"C:\Users\PC\AppData\Local\Programs\Python\Python39\chromedriver.exe")
# 推荐方式：
services = Service("chromedriver.exe")
# 浏览器不会自动关闭的方法（不用背下来！！方便你调试用的，后面也要删）
"""option = webdriver.ChromeOptions() # todo：chrome浏览器配置项
option.add_experimental_option("detach", True)# todo：浏览器不会自动关闭"""

# 初始化driver
driver = webdriver.Chrome(service = services) # ,options=option

# 打开浏览器
driver.get("https://www.baidu.com/") # 输入要打开的地址

#浏览器最大化
driver.maximize_window()
# ==================没变化========================
"""
测试用例1：
1. 打开百度网页
2. 输入HIS医疗
3. 点击搜索
4. 点击出现的一个链接
"""
"""
# 1. 打开百度网页
driver.get("https://www.baidu.com/")
# 2. 输入HIS医疗
driver.find_element(By.ID,"kw").send_keys("HIS医疗")
# 3. 点击搜索
driver.find_elements(By.CLASS_NAME,"bg")[1].click()
# 4. 点击出现的一个链接
# driver.find_element(By.XPATH,"//*[@id='3001']/div/div[1]/div/div/h3/div/a").click()
driver.find_element(By.CSS_SELECTOR,r"#\33 001 > div > div:nth-child(1) > div > div > h3 > div > a").click()
time.sleep(5)
"""
"""
上述代码，明明没有问题，但就是达不到预期的结果，为啥？
因为机器也需要等待元素加载的时间
你需要等待元素加载完之后，再去做操作
那我该怎么加？
"""
# 第一种：time.sleep，强制等待，每一个操作，元素等待一下就好了
"""
# 1. 打开百度网页
driver.get("https://www.baidu.com/")
# 2. 输入HIS医疗
time.sleep(2)
driver.find_element(By.ID,"kw").send_keys("HIS医疗")
# 3. 点击搜索
time.sleep(2)
driver.find_elements(By.CLASS_NAME,"bg")[1].click()
# 4. 点击出现的一个链接
# driver.find_element(By.XPATH,"//*[@id='3001']/div/div[1]/div/div/h3/div/a").click()
time.sleep(2)
driver.find_element(By.CSS_SELECTOR,r"#\33 001 > div > div:nth-child(1) > div > div > h3 > div > a").click()
time.sleep(5)
"""
"""
思考：
每一步操作都加上：time.sleep()，我有100个步骤，都加？
都加？太冗余
不加？ 执行不通过啊
"""
# selenium提供了一种隐式等待的方式，只需要声明一次，后续的元素都受益等待时长
"""
driver.implicitly_wait(15) # 元素全部加载出来以后，再去做操作
# 1. 打开百度网页
driver.get("https://www.baidu.com/")

# 2. 输入HIS医疗
driver.find_element(By.ID,"kw").send_keys("HIS医疗")

# 3. 点击搜索
driver.find_elements(By.CLASS_NAME,"bg")[1].click()

# 4. 点击出现的一个链接
# driver.find_element(By.XPATH,"//*[@id='3001']/div/div[1]/div/div/h3/div/a").click()

driver.find_element(By.CSS_SELECTOR,r"#\33 001 > div > div:nth-child(1) > div > div > h3 > div > a").click()
time.sleep(5)
"""
# 第三种等待方式：显示等待
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
"""
在规定的时间内，频繁的去找元素，如果找不到则报错，抛出异常
"""
"""
# 1. 打开百度网页
driver.get("https://www.baidu.com/")
# 2. 输入HIS医疗
WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.ID,'kw'))).send_keys("HIS医疗")
# 3. 点击搜索
WebDriverWait(driver,10,0.5).until(EC.presence_of_all_elements_located((By.CLASS_NAME,"bg")))[1].click()
# 4. 点击出现的一个链接
WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.CSS_SELECTOR,r"#\33 001 > div > div:nth-child(1) > div > div > h3 > div > a"))).click()
time.sleep(5)
"""

"""
三种等待方式的特点
【强制等待】：
1.代码执行到此，无论如何，都要强制停留几秒
【隐式等待】：
1. 开局声明一次，后续的元素都会受用
2. 全部的元素加载出来以后，再去做操作，不管你会不会用到
【显示等待】：
1.会在给定的时间内，频繁的去找元素
用法：WebDriverWait(driver,10,0.5)
第一个参数：driver，驱动
第二个参数：总时长
第三个参数：轮询的频率，默认就是0.5s
.until(EC.presence_of_element_located())
presence_of_element_located((By.NAME,"xxx"))：只支持一个参数传递，所以使用的时候用元组来传参
"""


